home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / djgpp / utils / gcc-rm / msdos.c < prev    next >
C/C++ Source or Header  |  1994-07-18  |  2KB  |  109 lines

  1. #include <sys/stat.h>
  2. #include <errno.h>
  3. #include <process.h>
  4. #include <ctype.h>
  5.  
  6. bcopy(a,b,c)
  7. {
  8.   return memcpy(b,a,c);
  9. }
  10.  
  11. bzero(a,b)
  12. {
  13.   return memset(a,0,b);
  14. }
  15.  
  16. index(a,b)
  17. {
  18.   return strchr(a,b);
  19. }
  20.  
  21. kill()
  22. {
  23. }
  24.  
  25. #undef getpid
  26. getpid()
  27. {
  28.   return 42;
  29. }
  30.  
  31. int system(const char *p)
  32. {
  33.   char fn[128];
  34.   char line[128];
  35.   sscanf(p, " %s %s", fn, line);
  36.   return spawnlp(P_WAIT, fn, fn, line, 0);
  37. }
  38.  
  39. char *
  40. mktemp(path)
  41.      char *path;
  42. {
  43.   extern int errno;
  44.   register char *start, *trv;
  45.   struct stat sbuf;
  46.   unsigned int pid;
  47.  
  48.   pid = getpid();
  49.   for (trv = path; *trv; ++trv); /* extra X's get set to 0's */
  50.   while (*--trv == 'X') {
  51.     *trv = (pid % 10) + '0';
  52.     pid /= 10;
  53.   }
  54.  
  55.   /*
  56.    * check the target directory; if you have six X's and it
  57.    * doesn't exist this runs for a *very* long time.
  58.    */
  59.   for (start = trv + 1;; --trv) {
  60.     if (trv <= path)
  61.       break;
  62.     if (*trv == '/') {
  63.       *trv = '\0';
  64.       if (trv[-1] == ':') {
  65.     *trv = '/';
  66.     break;
  67.       }
  68.       if (strcmp(path, ".")
  69.       && strcmp(path, "..")
  70.       && strcmp(path+1, ":")
  71.       && strcmp(path+1, ":./")
  72.       && strcmp(path+1, ":../")
  73.       && strcmp(path+1, ":/"))
  74.       {
  75.     if (stat(path, &sbuf))
  76.       return(0);
  77.     if (!(sbuf.st_mode & S_IFDIR)) {
  78.       errno = ENOTDIR;
  79.       return(0);
  80.     }
  81.       }
  82.       *trv = '/';
  83.       break;
  84.     }
  85.   }
  86.  
  87.   for (;;) {
  88.     if (stat(path, &sbuf))
  89.       return(errno == ENOENT ? path : 0);
  90.  
  91.     /* tricky little algorithm for backward compatibility */
  92.     for (trv = start;;) {
  93.       if (!*trv)
  94.     return(0);
  95.       if (*trv == 'z')
  96.     *trv++ = 'a';
  97.       else {
  98.     if (isdigit(*trv))
  99.       *trv = 'a';
  100.     else
  101.       ++*trv;
  102.     break;
  103.       }
  104.     }
  105.   }
  106.   /*NOTREACHED*/
  107. }
  108.  
  109.